package com.xuanyuanxinyu.utils.screen

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.res.Configuration
import android.graphics.Point
import android.os.Build
import android.view.Display
import android.view.Gravity
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.view.WindowManager
import com.xuanyuanxinyu.utils.LogUtils


/**
 * @FileName:ScreenUtils
 * @Description:屏幕适配工具类
 * @author ken.luo
 * @date 2023/4/4
 * @version V1.0
 * @email 424533553@qq.com
 */
object ScreenUtils {
    /**
     * 判断当前的是否处于大屏平板模式下
     */
    private fun isTablet(context : Context) : Boolean {
        return context.resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK >= Configuration.SCREENLAYOUT_SIZE_LARGE
    }
    
    /**
     * 动态判断是否平板窗口在平板设备上，也可能返回false。如分屏模式下
     * 如想判断物理设备是不是平板，请使用 isTabletDevice
     * @return true:平板,false:手机
     * @see isTabletDevice
     */
    private fun isTabletWindow(context : Context) : Boolean {
        return context.resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK >= Configuration.SCREENLAYOUT_SIZE_LARGE
    }
    
    /**
     * 判断自己是否在小窗
     */
    private fun isInSmallMode(activity : Activity) : Boolean {
        //  activity.onMultiWindowModeChanged(boolean isInMultiWindowMode,Configuration newConfig)
        activity.isInMultiWindowMode //判断是否处于多窗口
        // 判断自己是否在小窗上
        val config = activity.resources.configuration.toString()
        val isInFreeformWindow = config.contains("freeform")
        return isInFreeformWindow
    }
    
    /**
     *
     * 手机上而言，窗口（或者Activity）大小就等于屏幕物理尺寸，但平板因为可以多窗口显示，并不总是相等。
     * 获取Activity的实际显示的窗口大小
     * @param context 使用每个Activity的Context，不要使用applicationContext
     */
    fun getDisplayMetrics(context : Activity) {
        val displayMetrics = context.resources.displayMetrics
        //不推荐使用下面的方式获取displayMetrics，因为不准确
        //        val displayMetrics2 = context.windowManager.defaultDisplay.getMetrics(outMetrics)
        LogUtils.logTest("" + displayMetrics.toString())
        
    }
    //    /**
    //     * 获取屏幕物理尺寸
    //     *
    //     * @param context 上下文
    //     * @return 物理尺寸
    //     */
    //    private fun getScreenPhysicsSize(context : Context) : DisplayMetrics {
    //        val display = getDisplay(context)
    //        display?.getRealMetrics(mMetrics)
    //        return mMetrics
    //    }
    /**
     * 获取窗口的大小
     */
    fun getScreenSize(context : Context) : Point {
        val point = Point()
        val displayMetrics = context.resources.displayMetrics
        point.x = displayMetrics.widthPixels
        point.y = displayMetrics.heightPixels
        return point
    }
    
    /**
     * 是否运行在平行窗口模式（华为、小米）
     * @param context 需要是Activity的context
     */
    fun inMagicWindow(context : Context) : Boolean {
        val config : String = context.resources.configuration.toString()
        return config.contains("hwMultiwindow-magic") || config.contains("miui-magic-windows") || config.contains("hw-magic-windows")
    }
    
    /**
     * 设备横屏，窗口不一定是横屏。如小窗和分屏模式有可能是竖屏。
     * 窗口是横屏
     */
    fun isWindowLandscape(context : Context) : Boolean {
        val orientation : Int = context.resources.configuration.orientation
        return orientation == Configuration.ORIENTATION_LANDSCAPE
    }
    
    /**
     * 这里注意Android7.0之后才支持分屏, isInMultiWindowMode为true时表示在分屏或小窗
     * @return true：判断是否在分屏模式或者小屏
     */
    @SuppressLint("ObsoleteSdkInt")
    fun isInMultiWindow(activity : Activity) : Boolean {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return activity.isInMultiWindowMode
        }
        return false
    }
    
    /**
     * 获取Display
     */
    private fun getDisplay(context : Context) : Display? {
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        return if (Build.VERSION.SDK_INT >= 30) {
            context.display!!
        } else {
            windowManager.defaultDisplay
        }
    }
    
    /**
     * 获取屏幕的方向 水平或垂直
     * 1:垂直
     * 2:水平
     *
     * 不要使用width > height的方式来判断窗口方向，这是不对的一种判断方式
     */
    private fun isDeviceLandscape(context : Activity) : Int {
        val orientation = context.resources.configuration.orientation
        return orientation
    }
    
    /**
     * 设备是横屏
     */
    fun isDeviceLandscape(context : Context) : Boolean {
        val screenPhysicsSize = context.resources.displayMetrics
        return screenPhysicsSize.widthPixels > screenPhysicsSize.heightPixels
    }
    /* dialog 适配  ************************************************/
    /**
     * 适配弹框在手机、平板中的大小
     */
    fun setDialogsize(dialog : Activity,context : Activity) {
        //        val resId = if (isTabletWindow(context)) R.style.DialogAnimFadeCenter else R.style.DialogAnimBottomUp
        //        dialog.window.setWindowAnimations(resId)
        dialog.window.attributes.gravity = if (isTabletWindow(context)) Gravity.CENTER else Gravity.BOTTOM
        dialog.window.attributes.width = if (isTabletWindow(context)) WRAP_CONTENT else MATCH_PARENT
    }
    
    /**
     * 打印信息
     */
     fun printerInfo(activity : Activity) {
        val isTablet = isTablet(activity)
        LogUtils.logTest(" isTablet == $isTablet")
        val isTabletWindow = isTabletWindow(activity)
        LogUtils.logTest(" isTabletWindow == $isTabletWindow")
        val isInSmallMode = isInSmallMode(activity)
        LogUtils.logTest(" isInSmallMode == $isInSmallMode")
        
        getDisplayMetrics(activity)
        val inMagicWindow = inMagicWindow(activity)
        LogUtils.logTest(" inMagicWindow == $inMagicWindow")
        val isWindowLandscape = isWindowLandscape(activity)
        LogUtils.logTest(" isWindowLandscape == $isWindowLandscape")
        val isDeviceLandscape = isDeviceLandscape(activity)
        LogUtils.logTest(" isDeviceLandscape == $isDeviceLandscape")
        val isInMultiWindow = isInMultiWindow(activity)
        LogUtils.logTest(" isInMultiWindow == $isInMultiWindow")
    }
    
}